#include "stammdaten.h"
#include "ui_stammdaten.h"

Stammdaten::Stammdaten(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Stammdaten)
{
    ui->setupUi(this);
    ui->stammdaten_table->sortByColumn(3, Qt::AscendingOrder);

    db = QSqlDatabase::database();

    connect(ui->stammdaten_table, SIGNAL(cellChanged(int,int)), this, SLOT(edit_stammdaten(int,int)));
    connect(ui->stammdaten_table, SIGNAL(itemSelectionChanged()), this, SLOT(check_delete()));
    connect(ui->delete_button, SIGNAL(clicked()), this, SLOT(delete_selection()));

    ui->stammdaten_table->setColumnWidth(0, 60);
    ui->stammdaten_table->setColumnWidth(1, 60);
    ui->stammdaten_table->setColumnWidth(2, 90);
    ui->stammdaten_table->setColumnWidth(3, 270);
    ui->stammdaten_table->setColumnWidth(4, 80);

    reloadStammdaten();
}

Stammdaten::~Stammdaten()
{
    delete ui;
}

void Stammdaten::showEvent(QShowEvent *)
{
    reloadStammdaten();
}

/** ========== SLOTS ========== **/

void Stammdaten::reloadStammdaten()
{
    ui->stammdaten_table->blockSignals(true);
    ui->stammdaten_table->setSortingEnabled(false);
    ui->stammdaten_table->clearContents();
    ui->stammdaten_table->setRowCount(0);

    if ( db.isOpen() || db.open() )
    {
        QSqlQuery q("SELECT `objektnr`, vdznr, gtin, `titel`, `preis` FROM `stammdaten`;", db);
        while ( q.next() )
        {
            QTableWidgetItem *objektnr = new QTableWidgetItem(q.value(0).toString());
            QTableWidgetItem *vdznr = new QTableWidgetItem(q.value(1).toString());
            QTableWidgetItem *gtin = new QTableWidgetItem(q.value(2).toString());
            QTableWidgetItem *titel = new QTableWidgetItem(q.value(3).toString());
            QTableWidgetItem *preis = new QTableWidgetItem( QString("%L1 €").arg(q.value(4).toFloat(),0,'f',2) );

            if ( !vdznr->text().isEmpty() )
            {
                preis->setFlags(Qt::ItemIsSelectable);
                preis->setText("automatisch");
            }

            objektnr->setData(Qt::UserRole, QVariant(objektnr->text()));
            titel->setData(Qt::UserRole, QVariant(titel->text()));
            preis->setData(Qt::UserRole, QVariant(q.value(4)));

            objektnr->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable);
            vdznr->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable);
            gtin->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable);

            ui->stammdaten_table->insertRow( ui->stammdaten_table->rowCount() );
            ui->stammdaten_table->setItem( ui->stammdaten_table->rowCount()-1, 0, objektnr );
            ui->stammdaten_table->setItem( ui->stammdaten_table->rowCount()-1, 1, vdznr );
            ui->stammdaten_table->setItem( ui->stammdaten_table->rowCount()-1, 2, gtin );
            ui->stammdaten_table->setItem( ui->stammdaten_table->rowCount()-1, 3, titel );
            ui->stammdaten_table->setItem( ui->stammdaten_table->rowCount()-1, 4, preis );;
        }
        q.finish();
    }

    ui->stammdaten_table->setSortingEnabled(true);
    ui->stammdaten_table->blockSignals(false);
}

void Stammdaten::edit_stammdaten(int row, int column)
{
    QTableWidgetItem *objektnr = ui->stammdaten_table->item(row, 0);
    QTableWidgetItem *titel = ui->stammdaten_table->item(row, 3);
    QTableWidgetItem *preis = ui->stammdaten_table->item(row, 4);
    QRegExp rx("[0-9]*([,.][0-9]{0,2}){0,1}");

    switch ( column )
    {
    case 3:
        if ( !titel->text().isEmpty() )
        {
            if (  titel->text() != titel->data(Qt::UserRole).toString() && ( db.isOpen() || db.open() ) )
            {
                /** Titel in den Stammdaten ändern **/
                QSqlQuery q(db);
                q.prepare("UPDATE `stammdaten` SET `titel` = :titel WHERE `objektnr` = :objektnr;");
                q.bindValue(":titel", titel->text());
                q.bindValue(":objektnr", objektnr->text());
                if ( q.exec() )
                {
                    titel->setData(Qt::UserRole, titel->text());
                }

                /** Prüfen, ob das Objekt in der aktuellen Remission vorkommt **/
                if ( da.isGTIN(objektnr->text()) )
                    q.prepare("SELECT `id` FROM `remission` WHERE `gtin` = '" + objektnr->text() + "' AND `archiv_id` = '-1';");
                else
                    q.prepare("SELECT `id` FROM `remission` WHERE (`gtin` LIKE '419" + objektnr->text() + "_____' OR `gtin` LIKE '414" + objektnr->text() + "_____' OR `gtin` LIKE '439" + objektnr->text() + "_____' OR `gtin` LIKE '434" + objektnr->text() + "_____') AND `archiv_id` = '-1';");
                q.exec();

                /** Anbieten, den Titel in der aktuellen Remission zu ändern **/
                if ( q.first() && QMessageBox::question(this, tr("Remission ändern"), tr("Soll der Titel in der aktuellen,\r\nnicht archivierten Remission geändert werden?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes )
                {
                    do
                    {
                        QSqlQuery s(db);
                        s.prepare("UPDATE `remission` SET `titel` = :titel WHERE `id` = :id;");
                        s.bindValue(":titel", titel->text());
                        s.bindValue(":id", q.value(0));
                        s.exec();
                    }
                    while ( q.next() );
                }
            }
        }
        else
        {
            titel->setText( titel->data(Qt::UserRole).toString() );
            QMessageBox::warning(this, tr("Titel ändern"), tr("Bitte geben Sie einen gültigen Titel ein."));
        }
        break;

    case 4:
        if ( preis->text().contains(rx) )
        {
            bool ok;
            float p = rx.cap(0).toInt(&ok);
            if (ok)
                p /= 100;
            else
                p = rx.cap(0).toFloat();

            if ( p != preis->data(Qt::UserRole).toFloat() && ( db.isOpen() || db.open() ) )
            {
                /** Preis in den Stammdaten ändern **/
                QSqlQuery q(db);
                q.prepare("UPDATE `stammdaten` SET `preis` = :preis WHERE `objektnr` = :objektnr;");
                q.bindValue(":preis", p);
                q.bindValue(":objektnr", objektnr->data(Qt::UserRole));
                if ( q.exec() )
                {
                    preis->setData(Qt::UserRole, p);
                    preis->setText( QString("%L1 €").arg(p,0,'f',2) );
                }

                /** Prüfen, ob das Objekt in der aktuellen Remission vorkommt **/
                if ( da.isGTIN(objektnr->text()) )
                    q.prepare("SELECT `id` FROM `remission` WHERE `gtin` = '" + objektnr->text() + "' AND `archiv_id` = '-1';");
                else
                    q.prepare("SELECT `id` FROM `remission` WHERE (`gtin` LIKE '419" + objektnr->text() + "_____' OR `gtin` LIKE '414" + objektnr->text() + "_____' OR `gtin` LIKE '439" + objektnr->text() + "_____' OR `gtin` LIKE '434" + objektnr->text() + "_____') AND `archiv_id` = '-1';");
                q.exec();

                /** Anbieten, den Preis in der aktuellen Remission zu ändern **/
                if ( q.first() && QMessageBox::question(this, tr("Remission ändern"), tr("Soll der Preis in der aktuellen,\r\nnicht archivierten Remission geändert werden?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes )
                {
                    do
                    {
                        QSqlQuery s(db);
                        s.prepare("UPDATE `remission` SET `preis` = :preis WHERE `id` = :id;");
                        s.bindValue(":preis", p);
                        s.bindValue(":id", q.value(0));
                        s.exec();
                    }
                    while ( q.next() );
                }
            }
        }
        else
        {
            QMessageBox::information(this, tr("Remission ändern"), tr("Bitte geben Sie einen gültigen Preis ein."));
        }
        break;
    }
}

void Stammdaten::check_delete()
{
    ui->delete_button->setEnabled( ui->stammdaten_table->selectedItems().isEmpty()?false:true );
}

void Stammdaten::delete_selection()
{
    if ( db.isOpen() || db.open() )
    {
        db.transaction();
        foreach ( QTableWidgetItem *i, ui->stammdaten_table->selectedItems() )
        {
            if ( i->column() == 0 )
            {
                QSqlQuery("DELETE FROM `stammdaten` WHERE `objektnr` = '" + i->text() + "';", db);
            }
        }
        db.commit();
        reloadStammdaten();
        check_delete();
    }
}

void Stammdaten::keyPressEvent(QKeyEvent *event)
{
    if ( !ui->stammdaten_table->selectedItems().isEmpty() && event->key() == Qt::Key_Delete )
    {
        delete_selection();
    }
}

void Stammdaten::on_update_pushButton_clicked()
{
    /** Objekt-Nr und Titel aus dem Online-Sortiment übernehmen **/
    db.transaction();
    QSqlQuery q(db);
    q.exec("SELECT objektnr, vdznr FROM stammdaten WHERE vdznr != '' AND objektnr LIKE 'rt%';");
    while (q.next())
    {
        if ( q.value(0).toString().left(2) == "rt" ) /** Es handelt sich um eine interne Objektnr **/
        {
            /** Prüfen, ob es zu der VDZ-Nr mehrere Objekt-Nr gibt **/
            QSqlQuery t("SELECT COUNT(*) FROM online_sortiment WHERE vdznr = "+q.value(1).toString()+";");
            if ( t.first() )
            {
                int num = t.value(0).toInt();
                QSqlQuery t("SELECT objektnr, vdznr, titel FROM online_sortiment WHERE vdznr = "+q.value(1).toString()+";");
                /** Es gibt nur eine Objekt-Nr **/
                if ( num == 1 )
                {
                    t.first();
                    QSqlQuery("UPDATE stammdaten SET objektnr = "+t.value(0).toString()+" WHERE vdznr = "+q.value(1).toString()+";", db);
                }
                /** Es gibt mehrere Objekt-Nr **/
                if ( num > 1 )
                {
                    QSqlQuery("DELETE FROM stammdaten WHERE vdznr = "+q.value(1).toString()+";", db);
                    while ( t.next() )
                    {
                        QSqlQuery s(db);
                        s.prepare("INSERT INTO stammdaten ( objektnr, vdznr, titel, multi ) VALUES ( :objektnr, :vdznr, :titel, :multi );");
                        s.bindValue(":objektnr", t.value(0));
                        s.bindValue(":vdznr", t.value(1));
                        s.bindValue(":title", t.value(2));
                        int multi = 0;
                        multi = t.value(2).toString().contains("Mo")?1:multi;
                        multi = t.value(2).toString().contains("Di")?2:multi;
                        multi = t.value(2).toString().contains("Mi")?3:multi;
                        multi = t.value(2).toString().contains("Do")?4:multi;
                        multi = t.value(2).toString().contains("Fr")?5:multi;
                        multi = t.value(2).toString().contains("Sa")?6:multi;
                        multi = t.value(2).toString().contains("So")?7:multi;
                        s.bindValue(":multi", multi);
                        s.exec();
                    }
                }
            }
        }
    }

    q.exec("SELECT objektnr FROM stammdaten WHERE vdznr != '';");
    while (q.next())
    {
        QSqlQuery t("SELECT titel, vdznr FROM online_sortiment WHERE objektnr = "+q.value(0).toString()+";");
        if ( t.first() )
        {
            QSqlQuery("UPDATE stammdaten SET titel = '"+t.value(0).toString()+"', vdznr = '"+t.value(1).toString()+"' WHERE objektnr = "+q.value(0).toString()+";", db);
        }
    }
    q.finish();
    db.commit();
    reloadStammdaten();
}
